<?php

require_once 'EspacoCultural.php';
require_once 'BancoDeDados.php';

class Facilidade {

    private $cod_facilidade;
    private $descricao;
    private $parecer;
    private $espaco;
    private $vinculado;

    public function &getCod_facilidade() {
        return $this->cod_facilidade;
    }

    public function setCod_facilidade(&$cod_facilidade) {
        $this->cod_facilidade = &$cod_facilidade;
    }

    public function &getDescricao() {
        return $this->descricao;
    }

    public function setDescricao(&$descricao) {
        $this->descricao = &$descricao;
    }

    public function &getParecer() {
        return $this->parecer;
    }

    public function setParecer(&$parecer) {
        $this->parecer = &$parecer;
    }

    /**
     *
     * @return EspacoCultural
     */
    public function &getEspaco() {
        return $this->espaco;
    }

    public function setEspaco(&$espaco) {
        $this->espaco = &$espaco;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    public function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("Facilidade existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into facilidade (descricao) values(?)');
        $result = $link->execute($stmt, array($this->descricao));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function cadastrarParecer() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into espaco_facilidade (cod_espaco, cod_facilidade, parecer) values(?,?,?)');
        $result = $link->execute($stmt, array($this->espaco->getCod_espaco(), $this->cod_facilidade, $this->parecer));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'descricao') {
            $this->descricao = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("Facilidade existente");
            }
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update facilidade set ' . $campo_id . ' = ? where cod_facilidade = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_facilidade));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarParecer() {
        if ($this->validar() != 1) {
            throw new Exception("Facilidade existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update espaco_facilidade set parecer = ? where cod_facilidade = ? and cod_espaco = ?');
        $result = $link->execute($stmt, array($this->parecer, $this->cod_facilidade, $this->espaco->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from facilidade where cod_facilidade = ?');
        $result = $link->execute($stmt, array($this->cod_facilidade));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluirParecer() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from espaco_facilidade where cod_facilidade = ? and cod_espaco = ?');
        $result = $link->execute($stmt, array($this->cod_facilidade, $this->espaco->getCod_espaco()));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from facilidade order by descricao');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $facilidade = new Facilidade();
            $facilidade->setCod_facilidade($row['cod_facilidade']);
            $facilidade->setDescricao($row['descricao']);
            $facilidade->setVinculado($facilidade->verificarVinculacao());
            $resultado[] = &$facilidade;
            unset($facilidade);
        }
        return $resultado;
    }

    public static function &listarPorEspaco(EspacoCultural $espaco) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select facilidade.cod_facilidade, facilidade.descricao, parecer from facilidade, espaco_facilidade order by descricao where facilidade.cod_facilidade = espaco_facilidade.cod_facidade and espaco_facilidade.cod_espaco = ?', array($espaco->getCod_espaco()));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $facilidade = new Facilidade();
            $facilidade->setCod_facilidade($row['cod_facilidade']);
            $facilidade->setDescricao($row['descricao']);
            $facilidade->setParecer($row['parecer']);
            $resultado[$row['cod_facilidade']] = &$facilidade;
            unset($facilidade);
        }
        return $resultado;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_facilidade from facilidade where descricao = ?', array($this->descricao));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    private function &verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_facilidade from espaco_facilidade where cod_facilidade = ?', array($this->cod_facilidade));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

}
?>